# 래퍼 객체
래퍼 객체(Primitive wrapper objects)를 이용해 원시값도 객체 안 프로퍼티를 사용할 수 있다.
원시 값에 메서드를 호출하려 하면 임시 객체가 만들어 지지만 JS 엔진의 훌륭한 내부 최적화로 매서드를 호출해도 많은 리소스를 쓰지 않음.
- instanceof 🔗
let str1 = new String('str1');
let str2 = 'str2';
typeof str1; // object
typeof str2; // string
st1 instanceof String; // true
st2 instanceof String; // false
str1 instanceof Object; // true
str2 instanceof Object; // false
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# Primitive wrapper objects 의 종류
- String : string primitive wrapper object.
- Number : number primitive wrapper object.
- Boolean : Boolean primitive wrapper object.
- Symbol : Symbol primitive wrapper object.
'valueOf()' 래퍼객체에서 감싼 원시값으로 접근하는 방법
by 준일님. 원시값을 객체 형태로 변환해 주는 것 같다.
console.log(Object(1), Object(''), Object(true), Object(null), Object(undefined));
// Nuber {1}, String {""}, {Boolean {true}, {} {}
1
2
2
# 원시 값과, 객체를 분리한 이유
- 원시값은 가능한 빠르고 가벼워야함
- 원시값을 다루는 일은 메서드를 사용하면 수월하다.
# String/Number/Boolean 을 생성자로 쓰지 말자.
typeof 0; // 'number'
typeof new Number(0); // object
1
2
2
논리 평가 시 항상 참을 반환
let zero = new Number(0);
if (zero) // 변수 zero는 객체이므로, 조건문이 참이된다.
alert('그런데 여러분은 zero가 참이라는 것에 동의하나요? ')
1
2
3
2
3
# String/Number/Boolean 생성자 없이 사용
인수를 원하는 형의 원시값(문자열, 숫자, 불린 값)으로 변환
let num = Number("123");
1
# null / undefined 의 메서드는 없다.
# 문자열에 프로퍼티 추가
let str = 'hello';
str.test = 5;
alert(str.test);
1
2
3
2
3
str 의 프로퍼티에 접근하려 하면 '래퍼 객체'가 만들어 진다.
# 엄격모드
래퍼객체를 수정하려 할 때 에러 발생
# 비엄격모드
래퍼 객체에 test 프로퍼티가 추가 되지만, 래퍼객체는 바로 삭제되기 때문에 마지막줄이 실행될 땐 test 를 찾을 수 없다.
# 심화 TODO
JS의 내부 래퍼객체 동작원리.